﻿using ContosoUniversity.Models;
using Microsoft.EntityFrameworkCore;

namespace ContosoUniversity.Data
{
    public class SchoolContext : DbContext
    {
        public SchoolContext(DbContextOptions<SchoolContext> options) : base(options)
        {
        }

        public DbSet<Course> Courses { get; set; }
        public DbSet<Enrollment> Enrollments { get; set; }
        public DbSet<Student> Students { get; set; }
        public DbSet<Department> Departments { get; set; }
        public DbSet<Instructor> Instructors { get; set; }
        public DbSet<OfficeAssignment> OfficeAssignments { get; set; }
        public DbSet<CourseAssignment> CourseAssignments { get; set; }
        public DbSet<Person> People { get; set; }

        // 当数据库创建完成后， EF 创建一系列数据表，表名默认和 DbSet 属性名相同。
        // 集合属性的名称一般使用复数形式，但不同的开发人员的命名习惯可能不一样，开发人员根据自己的情况确定是否使用复数形式。
        // 在定义 DbSet 属性的代码之后，添加下面代码，对 DbContext 指定单数的表名来覆盖默认的表名。

        // DbContext 类的 OnModelCreating 方法中的代码使用 Fluent API 来配置 EF 行为 
        // API 称为“Fluent”，因为它通常在将一系列方法调用连接成单个语句后才能使用
        // 本教程仅将 Fluent API 用于数据库映射,Fluent API 还可用于指定大多数格式化、验证和映射规则，这可通过特性完成。
        // 某些开发者倾向于仅使用 Fluent API 以保持实体类的“纯净”。 如有需要，可混合使用特性和 Fluent API，且有些自定义只能通过 Fluent API 实现，
        // 但通常建议选择一种方法并尽可能坚持使用这一种。 如果确实要使用两种，请注意，只要出现冲突，Fluent API 就会覆盖特性。
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Course>().ToTable("Course");
            modelBuilder.Entity<Enrollment>().ToTable("Enrollment");
            modelBuilder.Entity<Student>().ToTable("Student");
            modelBuilder.Entity<Department>().ToTable("Department");
            modelBuilder.Entity<Instructor>().ToTable("Instructor");
            modelBuilder.Entity<OfficeAssignment>().ToTable("OfficeAssignment");
            modelBuilder.Entity<CourseAssignment>().ToTable("CourseAssignment");
            modelBuilder.Entity<Person>().ToTable("Person");

            //添加新实体并配置 CourseAssignment 实体的组合主键。
            modelBuilder.Entity<CourseAssignment>()
                .HasKey(c => new { c.CourseID, c.InstructorID });
        }
    }
}